儲存屬性用於定義class或是struct的某些特性,儲存屬性就是用變數或是常數儲存的有意義的值。
class student {
// 定義姓名和年齡
var name: String
var age: Int
// 提供一個構造方法
init(name: String, age: Int, sex: String) {
self.name = name
self.age = age
self.sex = sex
}
}
在class中有個原則,是class被構造完成時,必須保證所有的屬性或是初始化完成,因此,一般情況下開發者會在建立的class中提供一個構造方式用來設置其中的屬性,也可以在宣告時就提供一個初始值。
class student {
// 定義姓名和年齡
var name: String
var age: Int
// 定義性別常數
let sex: String
// 提供一個構造方法
init(name: String, age: Int, sex: String) {
self.name = name
self.age = age
self.sex = sex
}
}
透夠點語法調用其屬性,需要注意的是,變數的屬性可以進行修改,常數的則不能修改,但是對於值類型,如果是常數接收,那不能進行修改,但假設是引用類型的,則都可以修改。
let point = Point(x: 2, y: 1)
// 會報錯
point.x = 3
// 這個則不會報錯
let point2 = PointC(x: 2, y: 2)
point2.y = 5
有關於儲存屬性,還有一個特性,Swift中可以將儲存屬性設置為儲存屬性。所謂延時屬性,是指類在實例構造的時候,並不會進行構造或是初始化,只有當開發者調用這個屬性時,此屬性才會構造或是初始化。
class Work {
var name: String
init(name: String) {
self.name = name
print("finish")
}
}
class People {
var age: Int
lazy var work: Work = Work(name: "teacher")
init(age: Int) {
self.age = age
}
}
// 構造People時沒有印出Word類的資訊
var people = People(age: 24)
// 使用work屬性才完成對Work的構造
print(people.work)
巧妙使用lazy屬性會提升程式碼的效能。
與儲存屬性相比,計算屬性更像是一個計算過程,用來描述這種可以由其他屬性透過計算而得到的屬性。
class Circle {
// 提供兩個儲存屬性
var r: Double
var center: (Double,Double)
// 提供周長面積計算屬性
var l: Double{
get{
return 2 * r * Double.pi
}
set{
r = newValue / 2 / Double.pi
}
}
var s: Double{
get{
return 2 * r * Double.pi
}
set{
r = sqrt(newValue / Double.pi)
}
}
init(r: Double, center: (Double,Double)) {
self.r = r
self.center = center
}
}
// 建立圓實例
var circle = Circle(r: 3, center: (3,3))
// 透過計算得到數值
print("(circle.l), (circle.s)")
// 透過周長和面積來設置圓的半徑
circle.l = 12 * Double.pi
print(circle.r)
circle.s = 25 * Double.pi
print(circle.r)
在計算過程中,通常會用到其他的儲存屬性,需要在計算屬性的set方法中,會將外界所設置的值默認為以newValue傳入。
class Circle {
// 提供兩個儲存屬性
var r: Double
var center: (Double,Double)
// 提供周長面積計算屬性
var l: Double{
get{
return 2 * r * Double.pi
}
set{
r = newValue / 2 / Double.pi
}
}
var s: Double{
get{
return 2 * r * Double.pi
}
// 自定義傳值名稱
set(newValue){
r = sqrt(newValue / Double.pi)
}
}
init(r: Double, center: (Double,Double)) {
self.r = r
self.center = center
}
}
關於計算屬性get與set方法,get方法是必不可少的,而set則是可選的,當一個計算屬性只有get沒有set的時候,此計算屬性是只讀的。
class TestClass {
var test: Int {
get{
return 10
}
}
}
var test = TestClass()
// 對只讀的屬性會報錯
test.test = 10
可以簡寫成這樣
class TestClass {
var test: Int{
return 10
}
}
接下來,是屬性監聽器與包裝器的介紹